﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data.SqlClient;
using System.Configuration;

public partial class Raspored : System.Web.UI.Page
{
    /// <summary>
    ///     <para>
    ///         Struktura koja se koristi za cuvanje na potrebnite informacii za predmetite i terminite vo koi se odrzuvaat casovite.
    ///     </para>
    /// </summary>
    [Serializable()]
    public struct Niza
    {
        public List<string> den;
        public List<string> od;
        public List<string> doo;
        public List<string> ime;
        public List<string> predmet;
        public List<bool> lab;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((int)Session["tip"] != 1) Response.Redirect("NO.aspx");
        else Session["strana"] = Request.RawUrl.ToString();
        if (!IsPostBack)
        {
            lblIme.Text = "Име: " + Session["ime"].ToString();
            lblPrezime.Text = "Презиме: " + Session["prezime"].ToString();
            lblIndeks.Text = "Индекс: " + Session["indeks"].ToString();
            Like_Totaly_Awesome_Function();
        }
    }
    /// <summary>
    ///     <para>
    ///         Like_Totaly_Awesome_Function funkcijata ja povikuva funkcijata rasp koja vraka 6 listi.
    ///         Tie se koristat za dinamicki da se kreira HTML tabela koja gi sodrzi predmetite (predavanja, auditoriski, laboratoriski) i
    ///         profesorite koi gi predavaat predmetite na daden student.
    ///         Funkcijata ja izminuva tabelata po redici, i za sekoj blok cas, go azurira column span-ot na soodvetnata kelija.
    ///     </para>
    /// </summary>
    protected void Like_Totaly_Awesome_Function()
    {
        // Ja povikuvame funkcijata raspored() koja vraka objekt Niza. Kreirame 6 listi vo koi gi stavame listite od objektot Niza
        Niza sRaspored = raspored();
        List<string> den = sRaspored.den;
        List<string> od = sRaspored.od;
        List<string> doo = sRaspored.doo;
        List<string> ime = sRaspored.ime;
        List<string> predmet = sRaspored.predmet;
        List<bool> lab = sRaspored.lab;

        int brojacDolzinaNaBlokCas1 = 0, brojacDolzinaNaBlokCas2 = 0, brojacDolzinaNaBlokCas3 = 0, brojacDolzinaNaBlokCas4 = 0, brojacDolzinaNaBlokCas5 = 0;
        string tipPredavanje1 = string.Empty, tipPredavanje2 = string.Empty, tipPredavanje3 = string.Empty, tipPredavanje4 = string.Empty, tipPredavanje5 = string.Empty, predmet1 = string.Empty, predmet2 = string.Empty, predmet3 = string.Empty, predmet4 = string.Empty, predmet5 = string.Empty;
        // Poceten html kod
        pnlPanela.Controls.Add(new LiteralControl("<table id='tabela' >"));
        pnlPanela.Controls.Add(new LiteralControl("<colgroup>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='even'/>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='odd'/>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='even'/>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='odd'/>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='even'/>"));
        pnlPanela.Controls.Add(new LiteralControl("<col class='odd'/>"));
        pnlPanela.Controls.Add(new LiteralControl("</colgroup>"));
        pnlPanela.Controls.Add(new LiteralControl("<thead><tr><th align='center' scope='col' id='par'>Час</th>"));
        pnlPanela.Controls.Add(new LiteralControl("<th scope='col' align='center' id='nep'>Понеделник</th>"));
        pnlPanela.Controls.Add(new LiteralControl("<th scope='col' id='par' align='center'>Вторник</th>"));
        pnlPanela.Controls.Add(new LiteralControl("<th scope='col' id='nep' align='center'>Среда</th>"));
        pnlPanela.Controls.Add(new LiteralControl("<th scope='col' id='par' align='center'>Четврток</th>"));
        pnlPanela.Controls.Add(new LiteralControl("<th scope='col' id='nep' align='center'>Петок</th></tr></thead>"));
        pnlPanela.Controls.Add(new LiteralControl("<tbody>"));

        // for ciklus vo koj se izminuvaat redicite
        for (int cas = 0; cas < 12; cas++)
        {
            pnlPanela.Controls.Add(new LiteralControl("<tr>"));
            bool imaPredavanje1 = false, imaPredavanje2 = false, imaPredavanje3 = false, imaPredavanje4 = false, imaPredavanje5 = false;
            int dolzinaNaBlokCas1 = 1, dolzinaNaBlokCas2 = 1, dolzinaNaBlokCas3 = 1, dolzinaNaBlockCas4 = 1, dolzinaNaBlokCas5 = 1;

            // for ciklus vo koj se izminuvaat site clenovi vo listata "od"
            for (int k = 0; k < od.Count; k++)
            {
                int predavanjeDen = Convert.ToInt32(den[k]); // se zema denot koga se odrzuva casot
                int predavanjeKraj = Convert.ToInt32(doo[k]); // se zema koga zavrsuva predavanjeto
                int predavanjePocetok = Convert.ToInt32(od[k]);// koga pocnuva predavanjeto
                bool labaratoriskaFlag = lab[k];
                if ((predavanjePocetok - 8) == cas)// Dokolku casot pocnuva vo soodvetnoto vreme za dadenata redica se izvrshuva if-ot
                {
                    //Presmetka za kolku casa trae predavanjeto (b - 8) bidejki prviot cas vo denot pocnuva vo 8 casot.
                    int rez = predavanjeKraj - predavanjePocetok + 1;

                    //Za soodveten den gi izvrshuva naredbite, se setira imeto n profesorot ili laboratorsiki vezbi vo zavisnost od "c". Se setira imeto na predmetot. 
                    switch (predavanjeDen)
                    {
                        case 1:
                            imaPredavanje1 = true;
                            dolzinaNaBlokCas1 = rez;
                            if (!labaratoriskaFlag)
                                tipPredavanje1 = ime[k];
                            else
                                tipPredavanje1 = "Лабораториски вежби";

                            predmet1 = predmet[k];
                            break;
                        case 2:
                            imaPredavanje2 = true;
                            dolzinaNaBlokCas2 = rez;
                            if (!labaratoriskaFlag)
                                tipPredavanje2 = ime[k];
                            else
                                tipPredavanje2 = "Лабораториски вежби";

                            predmet2 = predmet[k];
                            break;
                        case 3:
                            imaPredavanje3 = true;
                            dolzinaNaBlokCas3 = rez;
                            if (!labaratoriskaFlag) tipPredavanje3 = ime[k];
                            else
                                tipPredavanje3 = "Лабораториски вежби";

                            predmet3 = predmet[k];
                            break;
                        case 4:
                            imaPredavanje4 = true;
                            dolzinaNaBlockCas4 = rez;
                            if (!labaratoriskaFlag)
                                tipPredavanje4 = ime[k];
                            else
                                tipPredavanje4 = "Лабораториски вежби";

                            predmet4 = predmet[k];
                            break;
                        case 5:
                            imaPredavanje5 = true;
                            dolzinaNaBlokCas5 = rez;
                            if (!labaratoriskaFlag)
                                tipPredavanje5 = ime[k];
                            else
                                tipPredavanje5 = "Лабораториски вежби";

                            predmet5 = predmet[k];
                            break;
                    }
                }
            }//Zavrsuva forot za site casovi od eden den

            // Proveruva dali e blok casovi. Dokolku e, za soodvetniot brojac se setira vrednosta na brojot na casovi
            if (dolzinaNaBlokCas1 != 1) brojacDolzinaNaBlokCas1 = dolzinaNaBlokCas1;
            if (dolzinaNaBlokCas2 != 1) brojacDolzinaNaBlokCas2 = dolzinaNaBlokCas2;
            if (dolzinaNaBlokCas3 != 1) brojacDolzinaNaBlokCas3 = dolzinaNaBlokCas3;
            if (dolzinaNaBlockCas4 != 1) brojacDolzinaNaBlokCas4 = dolzinaNaBlockCas4;
            if (dolzinaNaBlokCas5 != 1) brojacDolzinaNaBlokCas5 = dolzinaNaBlokCas5;

            //Se dodava prvata kelija na redicite
            switch (cas)
            {
                case 0: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>08:00-08:45</td>")); break;
                case 1: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>09:00-09:45</td>")); break;
                case 2: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>10:00-10:45</td>")); break;
                case 3: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>11:00-11:45</td>")); break;
                case 4: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>12:00-12:45</td>")); break;
                case 5: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>13:00-13:45</td>")); break;
                case 6: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>14:00-14:45</td>")); break;
                case 7: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>15:00-15:45</td>")); break;
                case 8: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>16:00-16:45</td>")); break;
                case 9: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>17:00-17:45</td>")); break;
                case 10: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>18:00-18:45</td>")); break;
                case 11: pnlPanela.Controls.Add(new LiteralControl("<td align='center'>19:00-19:45</td>")); break;
            }

            //Proveruva dali ima cas so "z1-5". Ako ima kreira kelija i ja polni kelijata so imeto na "name1-5" i "predmet1-5".
            //Isto taka, ako se raboti za blok casovi, na kelijata se stava rowspan so golemina na brojot na casovi vo blokot. (dolzinaNaBlokCas1-5)
            //Ako nema proveruva brojacot sto gleda dali ima blok casovi dali e ednakov na nula. Ako e kreira prazna kelija.
            if (imaPredavanje1) pnlPanela.Controls.Add(new LiteralControl("<td  align='center' rowspan=" + dolzinaNaBlokCas1 + "><h4>" + predmet1 + "<br/></h4><font color=#808080>" + tipPredavanje1 + "</font></td>"));
            else if (brojacDolzinaNaBlokCas1 == 0) pnlPanela.Controls.Add(new LiteralControl("<td></td>"));

            if (imaPredavanje2) pnlPanela.Controls.Add(new LiteralControl("<td align='center' rowspan=" + dolzinaNaBlokCas2 + "><h4>" + predmet2 + "<br/></h4><font color=#808080>" + tipPredavanje2 + "</font></td>"));
            else if (brojacDolzinaNaBlokCas2 == 0) pnlPanela.Controls.Add(new LiteralControl("<td></td>"));

            if (imaPredavanje3) pnlPanela.Controls.Add(new LiteralControl("<td align='center' rowspan=" + dolzinaNaBlokCas3 + "><h4>" + predmet3 + "<br/></h4><font color=#808080>" + tipPredavanje3 + "</font></td>"));
            else if (brojacDolzinaNaBlokCas3 == 0) pnlPanela.Controls.Add(new LiteralControl("<td></td>"));

            if (imaPredavanje4) pnlPanela.Controls.Add(new LiteralControl("<td align='center' rowspan=" + dolzinaNaBlockCas4 + "><h4>" + predmet4 + "<br/></h4><font color=#808080>" + tipPredavanje4 + "</font></td>"));
            else if (brojacDolzinaNaBlokCas4 == 0) pnlPanela.Controls.Add(new LiteralControl("<td></td>"));

            if (imaPredavanje5) pnlPanela.Controls.Add(new LiteralControl("<td align='center' rowspan=" + dolzinaNaBlokCas5 + "><h4>" + predmet5 + "<br/></h4><font color=#808080>" + tipPredavanje5 + "</font></td>"));
            else if (brojacDolzinaNaBlokCas5 == 0) pnlPanela.Controls.Add(new LiteralControl("<td></td>"));

            pnlPanela.Controls.Add(new LiteralControl("</tr>"));

            //Ako brojacot ne e ednakov na nula go namaluva
            if (brojacDolzinaNaBlokCas1 != 0) brojacDolzinaNaBlokCas1--;
            if (brojacDolzinaNaBlokCas2 != 0) brojacDolzinaNaBlokCas2--;
            if (brojacDolzinaNaBlokCas3 != 0) brojacDolzinaNaBlokCas3--;
            if (brojacDolzinaNaBlokCas4 != 0) brojacDolzinaNaBlokCas4--;
            if (brojacDolzinaNaBlokCas5 != 0) brojacDolzinaNaBlokCas5--;

        }//Zavrsuva forot za denovi. Nov den e :)
        pnlPanela.Controls.Add(new LiteralControl("</tbody>"));
        pnlPanela.Controls.Add(new LiteralControl("</table>"));
    }

    /// <summary>
    ///     <para>
    ///         Funckijata raspored() vrakja objekt od tipot Niza, koj prethodno go polni so rasporedot za soodvetniot korisnik.
    ///         Od bazata se zemaat site casovi (predavanja, auditoriski i labaratoriski) za predmetite koi gi slusa tekovniot korisnik.
    ///         Se zema pocetnoto vreme, krajnoto vreme, denot na odrzuvanje, imeto na profesorot/asistentot koj go odrzuva casot
    ///         i imeto na predmetot.
    ///     </para>
    /// </summary>
    /// <returns></returns>
    protected Niza raspored()
    {
        //Kreiranje na konekcija kon bazata
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Kreiranje na SQL query za zemanje na 
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;
        komanda.CommandText = "SELECT p.den, p.doo, p.od, pr.Predmet,p.AU_PR, k.Ime, k.Prezime FROM Predava AS p, Slusa AS s, Korisnici as k, Predmet AS pr WHERE p.prof_ID=k.KorIme AND p.prof_ID=s.s_prof AND pr.p_ID=s.s_predmet AND s.s_predmet=p.predmet_ID AND s.s_student='" + Session["korisnicko"].ToString() + "'";
        List<string> den = new List<string>();
        List<string> od = new List<string>();
        List<string> doo = new List<string>();
        List<string> ime = new List<string>();
        List<string> predmet = new List<string>();
        List<bool> lab = new List<bool>();
        Niza lista = new Niza();
        try
        {
            konekcija.Open();
            SqlDataReader citac = komanda.ExecuteReader();
            while (citac.Read())
            {
                den.Add(citac["den"].ToString());
                od.Add(citac["od"].ToString());
                doo.Add(citac["doo"].ToString());
                if ((bool)citac["AU_PR"]) ime.Add(citac["Ime"].ToString() + " " + citac["Prezime"].ToString() + " <br/> Предавање");
                else ime.Add(citac["Ime"].ToString() + " " + citac["Prezime"].ToString() + " <br/> Аудиториски");
                predmet.Add(citac["Predmet"].ToString());
                lab.Add(false);
            }
            citac.Close();
            komanda.CommandText = "SELECT s.den, s.doo, s.ood, pr.Predmet FROM Slusa AS s, Predmet AS pr WHERE s.s_predmet=pr.p_ID AND s.den IS NOT NULL AND s.s_student='" + Session["korisnicko"].ToString() + "'";
            citac = komanda.ExecuteReader();
            while (citac.Read())
            {
                den.Add(citac["den"].ToString());
                od.Add(citac["ood"].ToString());
                doo.Add(citac["doo"].ToString());
                predmet.Add(citac["Predmet"].ToString());
                lab.Add(true);
            }
            citac.Close();
        }
        catch (Exception er) { }
        finally
        {
            lista.den = den;
            lista.doo = doo;
            lista.ime = ime;
            lista.predmet = predmet;
            lista.od = od;
            lista.lab = lab;
            konekcija.Close();
        }
        return lista;
    }

}